Skip to main content

9、SwiftUI中使用UIKit

SwiftUI 是 在 WWDC 2019 上宣布 的,仅适用于运行 iOS 13 及更高版本的设备。由于其相对不成熟,与 UIKit 相比,SwiftUI 可能缺乏广泛的 API 支持。例如,截至 2021 年 7 月,只能使用 UIKit 的UIImagePickerController选择图片和视频。因此,需要在 SwiftUI 中实现某些 UIKit API。

本章,我们将看看如何在 SwiftUI 中使用 UIKit API。我们将创建一个包装UIActivityIndicatorView的View,然后在 SwiftUI 中显示一个ActivityIndicator。

Getting ready

新建一个SwiftUI工程,叫做UIKitToSwiftUI

How to do it…

我们能够通过UIViewRepresentable协议来在SwiftUI中显示UIKit View。

  1. 新建文件,选择Swift File,命名ActivityIndicator
  2. 替换import Foundationimport SwiftUI
import SwiftUI
  1. 修改ActivityIndicator遵循UIViewRepresentable协议
struct ActivityIndicator: UIViewRepresentable {
var animating: Bool
func updateUIView(_ activityIndicator: UIActivityIndicatorView, context: Context) {
if self.animating {
activityIndicator.startAnimating()
} else {
activityIndicator.stopAnimating()
}
}

func makeUIView(context: Context) -> UIActivityIndicatorView {
return UIActivityIndicatorView()
}
}
  1. 打开ContentView.swift,使用我们刚刚的ActivityIndicator
struct ContentView: View {
@State var animated = false
var body: some View {
VStack {
ActivityIndicator(animating: animated)
HStack {
Toggle(isOn: $animated) {
Text("Toggle Activity")
}
}
}
}
}

最终结果:

image-20211224150803446

How it works…

我们通过实现UIViewRepresentable协议来将UIKit View包裹为一个SwiftUI View。

ActivityIndicator.swift 文件中,我们实现了一个 struct, 遵循UIViewRepresentable协议。

协议要求我们实现 makeUIViewupdateUIView 这两个函数。

makeUIView 负责创建和准备View

updateUIView 负责当animation改变时更新 UIView